技巧25 在容器里设置正确的时区

如果你曾经安装过完整的操作系统,那么你应该知道设置时区也是安装流程的一部分。即便容器不是操作系统(或虚拟机),它也同样包含了那些告诉程序该如何解释所配置的时区的对应时间的文件。

问题

想要为容器正确地设置时区。

解决方案

将容器的localtime文件替换成所需时区的链接。

代码清单4-12演示了这一问题。无论在世界的哪个地方运行它,容器均会显示同一个时区。

代码清单4-12 以错误的时区启动容器

$ date +%Z  ⇽--- 执行命令展示宿主机上的时区配置
 GMT  ⇽--- 宿主机上的时区为GMT
$ docker run centos:7 date +%Z  ⇽--- 运行一个容器,然后输出容器里的日期时间
 UTC  ⇽--- 容器里的时区为UTC

容器里包含了决定使用哪个时区来转换它所获取的时间的值的文件。当然,实际使用的时间由宿主机上的操作系统跟踪。

代码清单4-13展示了该如何将时区设置为预期的时区。

代码清单4-13 替换centos:7的默认时区的Dockerfile

FROM centos:7  ⇽--- 启动我们看到的这个centos镜像
RUN rm -rf /etc/localtime  ⇽--- 删除现有的localtime软链接文件
RUN ln -s /usr/share/zoneinfo/GMT /etc/localtime  ⇽--- 将/etc/localtime软链接文件替换成预期的时区
CMD date +%Z  ⇽--- 将展示当前容器时区配置作为默认命令执行

在代码清单4-13里,关键文件是/etc/localtime。当询问时间时,它会通过所指向的文件告诉容器使用哪个时区。UTC标准时间是默认时区,如果文件不存在,系统将会使用它(比如,最精简的BusyBox镜像,它就没有这个文件)。

代码清单4-14展示了构建前面的Dockerfile的输出内容。

代码清单4-14 构建替换时区的Dockerfile

$ docker build -t timezone_change .   ⇽--- 构建容器
Sending build context to Docker daemon 62.98 kB
Step 1 : FROM centos:7
7: Pulling from library/centos
45a2e645736c: Pull complete
Digest: sha256:
➥ c577af3197aacedf79c5a204cd7f493c8e07ffbce7f88f7600bf19c688c38799
Status: Downloaded newer image for centos:7
 ---> 67591570dd29
Step 2 : RUN rm -rf /etc/localtime
 ---> Running in fb52293849db
 ---> 0deda41be8e3
Removing intermediate container fb52293849db
Step 3 : RUN ln -s /usr/share/zoneinfo/GMT /etc/localtime
 ---> Running in 47bf21053b53
 ---> 5b5cb1197183
Removing intermediate container 47bf21053b53
Step 4 : CMD date +%Z
 ---> Running in 1e481eda8579
 ---> 9477cdaa73ac
Removing intermediate container 1e481eda8579
Successfully built 9477cdaa73ac
$ docker run timezone_change  ⇽--- 运行容器
GMT  ⇽--- 输出指定的时区

通过这种方式,可以指定想要使用的时区——并且也只在容器生效。许多应用都依赖这一设置,因此如果正在运行Docker服务,这种需求并不少见。

容器级别的时间粒度可以解决另外一个问题。如果你正在为一家跨国公司工作,并且在世界各地的数据中心的服务器上运行着许多不同的应用程序,就可以更改镜像里的时区并且相信它在任何地方都能上报正确的时间,这是一个必须掌握的实用技巧。

讨论

Docker镜像的核心是无论在何处运行容器都能明确地提供一致的体验,如果想要根据镜像部署到不同的地点得到不同的结果,那么可能会遇到很多问题。

举个例子,如果想要为不同地点的客户自动生成对应的CSV电子数据表,那么他们可能对数据格式有一定的要求。美国客户可能希望采用mm/dd格式的日期,而欧洲人可能希望采用 dd/mm格式的日期,而中国客户可能希望采用他们自己的日期格式。

在技巧26里,我们将考虑如何实现语言环境设置,这些设置会影响包括日期和时间会以怎样的 local 格式打印等在内的许多东西。

results matching ""

    No results matching ""